package com.yili.printer.generator;

import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * 产品标签生成器
 * 负责生成产品信息标签的ZPL打印指令，支持中文显示
 * 标签尺寸：110mm × 50mm
 */
public class ProductLabelGenerator implements Generator {

    private static final Logger logger = LogManager.getLogger(ProductLabelGenerator.class);

    /**
     * 根据Map数据生成产品标签ZPL打印指令
     * 
     * @param printContent 打印内容Map
     * @return ZPL打印指令字符串
     */
    @Override
    public String generate(Map<String, String> printContent) {

        StringBuilder zpl = new StringBuilder();

        // 开始标签
        zpl.append("^XA");

        // 设置标签尺寸（110mm × 50mm，203 DPI）
        zpl.append("^PW880"); // 设置标签宽度为880点（110mm）
        zpl.append("^LL400"); // 设置标签长度为400点（50mm）

        // 设置字符编码为UTF-8以支持中文
        zpl.append("^CI28"); // UTF-8编码

        // 设置字体大小（适应50mm高度）
        zpl.append("^CF0,25,20"); // 较小字体适应紧凑布局

        // 布局参数（适应50mm高度）
        int leftMargin = 20; // 左边距
        int startY = 20; // 起始Y位置
        int lineHeight = 45; // 紧凑行间距
        int currentY = startY;

        // 从Map中获取数据
        String productName = printContent.get("productName");
        String manufacturer = printContent.get("manufacturer");
        String licenseNumber = printContent.get("licenseNumber");
        String postalCode = printContent.get("postalCode");
        String productionBatch = printContent.get("productionBatch");
        String bagCount = printContent.get("bagCount");
        String specification = printContent.get("specification");

        // 1. 产品名称（支持折行）
        if (productName != null && !productName.isEmpty()) {
            if (productName.length() > 15) {
                // 产品名称过长，分两行显示
                String line1 = productName.substring(0, 15);
                String line2 = productName.substring(15);
                zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                        .append("^FD产品名称：").append(line1).append("^FS");
                currentY += lineHeight;
                zpl.append("^FO").append(leftMargin + 120).append(",").append(currentY)
                        .append("^FD").append(line2).append("^FS");
            } else {
                zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                        .append("^FD产品名称：").append(productName).append("^FS");
            }
            currentY += lineHeight;
        }

        // 2. 生产商
        if (manufacturer != null && !manufacturer.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD生产商：").append(manufacturer).append("^FS");
            currentY += lineHeight;
        }

        // 3. 生产许可证编号
        if (licenseNumber != null && !licenseNumber.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD许可证编号：").append(licenseNumber).append("^FS");
            currentY += lineHeight;
        }

        // 4. 邮编
        if (postalCode != null && !postalCode.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD邮编：").append(postalCode).append("^FS");
            currentY += lineHeight;
        }

        // 5. 产品状态（固定值"合格"）
        zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                .append("^FD产品状态：合格").append("^FS");
        currentY += lineHeight;

        // 6. 生产批次
        if (productionBatch != null && !productionBatch.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD生产批次：").append(productionBatch).append("^FS");
            currentY += lineHeight;
        }

        // 7. 袋数
        if (bagCount != null && !bagCount.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD袋数：").append(bagCount).append("^FS");
            currentY += lineHeight;
        }

        // 8. 规格
        if (specification != null && !specification.isEmpty()) {
            zpl.append("^FO").append(leftMargin).append(",").append(currentY)
                    .append("^FD规格：").append(specification).append("^FS");
        }

        // 结束标签
        zpl.append("^XZ");

        logger.debug("生成的产品标签ZPL指令: " + zpl.toString());
        return zpl.toString();
    }
}